﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using log4net;
using GS1.Utilitario;
using System.Drawing.Imaging;
using System.Configuration;

namespace SegIdenPC.Formularios
{
    public partial class frmMantPrestamo : Form
    {

        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmMantPrestamo));

        private const string TITULO = "Mantenimiento de Solicitudes de Prestamos";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total productos encontrados: {0}";
       

        public enum OperacionMantenimiento
        {
            Nuevo,
            Editar
        }

        private OperacionMantenimiento tipoOperacion = OperacionMantenimiento.Nuevo;

        private enum Opcion
        {
            Abrir = 0,
            Nuevo = 1,
            Editar = 2,
            Grabar = 3,
            Atendido = 4,
            Eliminar = 5,
            Generar = 6,
            Cancelar = 7
        }

        private Prestamo prestamoActual = null;
        private Cliente clienteActual = null;
        private ListaTienda listaTienda = null;

        private ListaPrestamo listaPrestamo = null;
        private ListaGuia listaGuia = null;
        private const string FORMATO_PRODUCTO_DESCRIPCION_DETALLADA = "{0} - {1} - {2} - {3}";

        private Producto producto = null;

        #endregion

        #region --- Constructor ---
        public frmMantPrestamo()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---

        private void frmMantPrestamo_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
        {
            if (!e.TabPage.Enabled) { e.Cancel = true; }
        }

        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void tbtnAbrir_Click(object sender, EventArgs e)
        {
            abrir();
        }
        private void btnDevolucion_Click(object sender, EventArgs e)
        {
            itemsDevolver();
        }
        private void btnAgregar_Click(object sender, EventArgs e)
        {
            agregarItem();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            quitarItem();
        }

        private void tbtnCancelar_Click(object sender, EventArgs e)
        {
            cancelar();
        }

        private void tbtnNuevo_Click(object sender, EventArgs e)
        {
            nuevo();
            /*if (this.tabPagListado.Enabled)
            {
                // Estableciendo estado de TagPage de Listado y datos
                this.tabPagListado.Enabled = false;
                this.tabPagDatos.Enabled = true;

                // Mostrar la segunda pagina del TabControl
                this.tabControl.SelectedIndex = 1;

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Nuevo);
            }
            if (this.tabPagDatos.Enabled)
            {
                // Estableciendo estado de TagPage de Listado y datos
                this.tabPagListado.Enabled = false;
                this.tabPagDatos.Enabled = true;

                // Mostrar la segunda pagina del TabControl
                this.tabControl.SelectedIndex = 1;
                nuevo();
            }*/
        }

        private void tbtnEditar_Click(object sender, EventArgs e)
        {
            editar();
        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
            grabar();
        }

        private void btnVenta_Click(object sender, EventArgs e)
        {
            crearVenta();
        }
        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            elegirCliente();
        }
        private void btnBuscarProducto_Click(object sender, EventArgs e)
        {
            elegirProducto();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            elegirClienteBusqueda();
        }

        #endregion


        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            ListaGeneral listaEstado = null;
            ListaGeneral listaTipoDocumento = null;
            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Activaciones de botones por rol
                controlBotonesPorRol();

                // Instanciando y creando listado de estado
                listaEstado = new ListaGeneral();
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_PENDIENTE, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_AUTORIZADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_RECEPCIONADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_PARCIAL , descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_DESPACHADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_DEVUELTO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO });

                // Instanciando y creando listado de documentos
                listaTipoDocumento = new ListaGeneral();
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_DNI, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_DNI });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_RUC, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_RUC });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_CE, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CE });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_CI, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CI });

                // Desactivando el grupo de campo de informacion
                this.tabPagDatos.Enabled = false;
                // Estableciendo Ficha 0 como seleccion incial
                this.tabControl.SelectedIndex = 0;
                // Capturando evento selecting en el control Tab
                this.tabControl.Selecting += new TabControlCancelEventHandler(tabControl_Selecting);

                // Estableciendo a 0 el texto del total de registros encontrados.
                this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, 0);

                // Desactivando el boton abrir.
                this.tbtnAbrir.Enabled = false;

                // Estableciendo datos del combo Estado
                this.cboEstado.DataSource = listaEstado;
                this.cboEstado.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboEstado.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboEstado.SelectedIndex = 0;

                // Estableciendo parametros del combo Tipo documento
                this.cboTipoDocumento.DataSource = listaTipoDocumento;
                this.cboTipoDocumento.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboTipoDocumento.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboTipoDocumento.SelectedIndex = 0;

                this.dtpFechaFin.Value = DateTime.Now;

                this.dtpFechaInicio.Value = DateTime.Now;

                // Estableciendo focus

                this.btnBuscar.Focus();

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }

        }

        private void controlBotonesPorRol()
        {
            if (ParametrosAplicacion.ROL_ADMINISTRADOR.codigo.Equals(ParametrosAplicacion.USUARIO_ACTUAL.rol.codigo)) { return; }

            this.tbtnNuevo.Visible = false;
            this.tbtnEditar.Visible = false;
            //this.tbtnEliminar.Visible = false;
            this.tbtnGrabar.Visible = false;
        }

        private void elegirClienteBusqueda()
        {
            using (frmMantCliente frmMantCliente = new frmMantCliente())
            {
                frmMantCliente.formularioBusqueda = true;
                if (frmMantCliente.ShowDialog() == DialogResult.Cancel) { return; }

                this.clienteActual = frmMantCliente.clienteActual;
                this.txtClienteBusqueda.Text = this.clienteActual.razonSocial;
            }

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_GUIA_PRESTAMO;

            operacion.guia = new Guia();
            operacion.guia.prestamo = new Prestamo();
            operacion.guia.prestamo.cliente = new Cliente();
            operacion.guia.prestamo.cliente = this.clienteActual;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de la lista de solicitudes pendientes de autorizacion
            this.listaGuia = contenidoXML.DeserializarTo<ListaGuia>();

            // Mostrar el total de registros encontrados
            this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, listaGuia.lista.Count);

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoPrestamos.AutoGenerateColumns = false;

            // Se establece la fuente de datos de la grilla
            this.dgvListadoPrestamos.DataSource = listaGuia.lista;

            // Activando o desactivando boton Abrir
            this.tbtnAbrir.Enabled = listaGuia.lista.Count > 0;

            // Colorear grilla deacuerdo a criterios
            pintarGrilla(dgvListadoPrestamos);
        }

        private void pintarGrilla(DataGridView grilla)
        {
            ListPersonalizada<Guia> listaGuia = null;
            listaGuia = (ListPersonalizada<Guia>)grilla.DataSource;

            if (listaGuia != null)
            {
                for (int i = 0; i < listaGuia.Count; i++)
                {
                    Guia guia = listaGuia[i];

                    grilla.Rows[i].Cells[0].Value = guia.prestamo.codPrestamo;
                    grilla.Rows[i].Cells[1].Value = guia.serie + " - " + guia.numero;
                    grilla.Rows[i].Cells[2].Value = Convert.ToDateTime(guia.prestamo.fechaFin).ToString(Constantes.FORMATO_FECHA);
                    switch (guia.prestamo.estado)
                    {
                        case Constantes.ESTADO_DOCUMENTO_DESPACHADO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_DEVUELTO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_IMPRESO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_IMPRESO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_PARCIAL:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_PENDIENTE:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_RECEPCIONADO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO;
                                break;
                            }
                    }
                }
            }
        }

        private void pintarGrillaPrestamoActual(DataGridView grilla)
        {
            ListPersonalizada<Item> listaItems = null;
            listaItems = (ListPersonalizada<Item>)grilla.DataSource;

            if (listaItems != null)
            {
                for (int i = 0; i < listaItems.Count; i++)
                {
                    var item = listaItems[i];
                    grilla.Rows[i].Cells[2].Value = item.producto.codProductoProveedor;
                    grilla.Rows[i].Cells[3].Value = item.producto.descripcion;
                    switch (item.estado)
                    {
                        case Constantes.ESTADO_ITEM_DE_BAJA:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DE_BAJA;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_DE_TRANSITO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DE_TRANSITO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_DESUNIDO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DESUNIDO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_DISPONIBLE:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DISPONIBLE;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_EN_BULTO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_EN_BULTO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_ENTREGADO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_ENTREGADO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_MANTENIMIENTO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_MANTENIMIENTO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_PRESTAMO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_PRESTAMO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_RECEPCION_PARCIAL:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_RECEPCION_PARCIAL;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_SEPARADO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_SEPARADO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_UNIDO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_UNIDO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_VENDIDO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_VENDIDO;
                                break;
                            }
                    }
                }
            }
        }

        private void salir()
        {
            this.Close();
        }
        private void elegirProducto()
        {
            using (frmMantProducto frmMantProducto = new frmMantProducto())
            {
                frmMantProducto.formularioBusqueda = true;
                if (frmMantProducto.ShowDialog() == DialogResult.Cancel) { return; }

                this.producto = frmMantProducto.productoActual;

                // Mostrar los datos del producto
                this.txtProductoCodigo.Text = producto.codigo;
                this.txtProductoDescripcion.Text = string.Format(FORMATO_PRODUCTO_DESCRIPCION_DETALLADA, producto.nivelProducto.descripcion,
                                                                                                         producto.nivelTipo.descripcion,
                                                                                                         producto.nivelMaterial.descripcion,
                                                                                                         producto.nivelColor.descripcion);
            }

            obtenerItems(this.producto);
        }

        private void obtenerItems(Producto producto)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_LISTAR_ITEMS_PRODUCTO;

                operacion.producto = new Producto();
                operacion.producto.codigo = producto.codigo;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                // Obteniendo Objeto de ListaItem
                ListaItem listaItem = contenidoXML.DeserializarTo<ListaItem>();

                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListadoItems.AutoGenerateColumns = false;

                // Se establece la fuente de datos de la grilla
                this.dgvListadoItems.DataSource = listaItem.lista;

                pintarGrillaPrestamoActual(this.dgvListadoItems);

                // Validar si el producto tiene items disponibles
                if (listaItem.lista.Count == 0)
                {
                    Libreria.ShowMessageboxExclamacion("El producto seleccionado, no tiene items disponibles", TITULO);
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void elegirCliente()
        {
            using (frmMantCliente frmMantCliente = new frmMantCliente())
            {
                frmMantCliente.formularioBusqueda = true;
                if (frmMantCliente.ShowDialog() == DialogResult.Cancel) { return; }

                this.clienteActual = frmMantCliente.clienteActual;
                this.cboTipoDocumento.Text = this.clienteActual.tipoDocumento;
                this.txtClienteNroDocumento.Text = this.clienteActual.nroDocumento;
                this.txtClienteRazonSocial.Text = this.clienteActual.razonSocial;
            }
        }


        private void abrir()
        {
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false;
            this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Abrir);

            // Valida si seleccione algun equipos
            if (this.dgvListadoPrestamos.CurrentRow != null && this.dgvListadoPrestamos.CurrentRow.Index > -1)
            {
                ListPersonalizada<Guia> listaGuia = (ListPersonalizada<Guia>)this.dgvListadoPrestamos.DataSource;
                this.prestamoActual = obtenerPrestamo(listaGuia[this.dgvListadoPrestamos.CurrentRow.Index].prestamo);
                
                this.txtCodigo.Text = prestamoActual.codPrestamo;

                this.txtSerieGuia.Text = listaGuia[this.dgvListadoPrestamos.CurrentRow.Index].serie;
                this.txtNumeroGuia.Text = listaGuia[this.dgvListadoPrestamos.CurrentRow.Index].numero;

                this.cboTipoDocumento.Text = prestamoActual.cliente.tipoDocumento;
                this.txtClienteNroDocumento.Text = prestamoActual.cliente.nroDocumento;
                this.txtClienteRazonSocial.Text = prestamoActual.cliente.razonSocial;

                this.dtpFechaInicio.Text = Convert.ToDateTime(prestamoActual.fechaInicio).ToString(Constantes.FORMATO_FECHA);
                this.dtpFechaFin.Text = Convert.ToDateTime(prestamoActual.fechaFin).ToString(Constantes.FORMATO_FECHA);

                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListadoItems.AutoGenerateColumns = false;
                this.dgvListadoItemsSeleccionados.AutoGenerateColumns = false;

                // Se establece fuente de datos
                this.dgvListadoItemsSeleccionados.DataSource = prestamoActual.listaItem.lista == null ?
                                                        new ListPersonalizada<Item>() :
                                                        prestamoActual.listaItem.lista;

                formatearGrilla(this.dgvListadoItemsSeleccionados);

                switch (prestamoActual.estado)
                {
                    case Constantes.ESTADO_DOCUMENTO_PENDIENTE:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE;
                        break;
                    case Constantes.ESTADO_DOCUMENTO_AUTORIZADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO;
                        break;
                    case Constantes.ESTADO_DOCUMENTO_DESPACHADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                       habilitarBotones(false);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_PARCIAL:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL;
                        //debe deshabilitar todos los botones y tambien los de consulta
                       habilitarBotones(false);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_DEVUELTO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        habilitarBotones(false);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_RECEPCIONADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        habilitarBotones(false);
                        break;
                }

                this.cboEstado.Enabled = false;
                this.cboTipoDocumento.Enabled = false;
                this.dtpFechaInicio.Enabled = false;
                this.dtpFechaFin.Enabled = false;
                this.btnBuscarProducto.Enabled = false;
                this.btnBuscarCliente.Enabled = false;
                this.btnAgregar.Enabled = false;
                this.btnEliminar.Enabled = false;
                this.btnDevolucion.Enabled = false;
                this.btnVenta.Enabled = false;
                //this.dgvListadoItems.Enabled = false;
                //this.dgvListadoItemsSeleccionados.Enabled = false;
     
                //se deshabilitan todos los botones
               // habilitarBotones(false);
            }
        }

        private void habilitarBotones(Boolean activar)
        {
            if (activar)
            {
                this.cboEstado.Enabled = true;
                this.cboTipoDocumento.Enabled = true;
                this.dtpFechaInicio.Enabled = true;
                this.dtpFechaFin.Enabled = true;
                this.btnBuscarProducto.Enabled = true;
                this.btnAgregar.Enabled = true;
                this.btnEliminar.Enabled = true;
                this.btnDevolucion.Enabled = false;
                this.btnVenta.Enabled = false;
            }
            else
            {
                this.cboEstado.Enabled = false;
                this.cboTipoDocumento.Enabled = false;
                this.dtpFechaInicio.Enabled = false;
                this.dtpFechaFin.Enabled = false;
                this.btnBuscarProducto.Enabled = false;
                this.btnAgregar.Enabled = false;
                this.btnEliminar.Enabled = false;
                this.btnDevolucion.Enabled = false;
                this.btnVenta.Enabled = false;
                this.btnBuscarProducto.Enabled = false;
            }
        }
    
        private void cambiarEstadoBotones(Opcion tipoOpcion)
        {
            switch (tipoOpcion)
            {
                case Opcion.Abrir:
                    this.tbtnEditar.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    break;
                case Opcion.Nuevo:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    break;
                case Opcion.Editar:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Grabar:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnEditar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Atendido:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Cancelar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnCancelar.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnSalir.Enabled = true;
                    break;
                case Opcion.Generar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    break;
            }
        }

        private Prestamo obtenerPrestamo(Prestamo prestamo)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_PRESTAMO;
            operacion.prestamo = prestamo;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return prestamo;
            }

            // Obteniendo Objeto de Producto
            Prestamo prestamoObtenido = contenidoXML.DeserializarTo<Prestamo>();

            return prestamoObtenido;

        }
        
        private void formatearGrilla(DataGridView grilla)
        {
            ListPersonalizada<Item> listaItems = null;
            listaItems = (ListPersonalizada<Item>)grilla.DataSource;

            if (listaItems != null)
            {
                for (int i = 0; i < listaItems.Count; i++)
                {
                    var item = listaItems[i];
                    grilla.Rows[i].Cells[2].Value = item.producto.codProductoProveedor;
                    grilla.Rows[i].Cells[3].Value = item.producto.descripcion;
                    switch (item.estado)
                    {
                        case Constantes.ESTADO_ITEM_DE_BAJA:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DE_BAJA;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_DE_TRANSITO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DE_TRANSITO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_DESUNIDO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DESUNIDO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_DISPONIBLE:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DISPONIBLE;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_EN_BULTO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_EN_BULTO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_ENTREGADO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_ENTREGADO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_MANTENIMIENTO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_MANTENIMIENTO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_PRESTAMO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_PRESTAMO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_RECEPCION_PARCIAL:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_RECEPCION_PARCIAL;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_SEPARADO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_SEPARADO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_UNIDO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_UNIDO;
                                break;
                            }
                        case Constantes.ESTADO_ITEM_VENDIDO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_VENDIDO;
                                break;
                            }
                    }
                }
            }
        }

        private void nuevo()
        {
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false;
            this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            this.grpDatos.Enabled = true;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Nuevo);

            this.tipoOperacion = OperacionMantenimiento.Nuevo;

            this.txtCodigo.Text = string.Empty;

            this.txtClienteNroDocumento.Text = string.Empty;
            this.txtClienteRazonSocial.Text = string.Empty;

            this.dtpFechaInicio.Value = DateTime.Now;
            this.dtpFechaFin.Value = DateTime.Now;

            this.txtProductoCodigo.Text = string.Empty;
            this.txtProductoDescripcion.Text = string.Empty;

            // Limpiando grilla de detalle de Items
            ListPersonalizada<Item> listaItem = (ListPersonalizada<Item>)this.dgvListadoItems.DataSource;
            ListPersonalizada<Item> listaItemsSeleccion = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;
            if (listaItem != null)
            {
                listaItem.Clear();

                this.dgvListadoItems.DataSource = null;
                this.dgvListadoItems.DataSource = listaItem;
            }

            if (listaItemsSeleccion != null)
            {
                listaItemsSeleccion.Clear();

                this.dgvListadoItemsSeleccionados.DataSource = null;
                this.dgvListadoItemsSeleccionados.DataSource = listaItemsSeleccion;
            }

            //se deshabilitan todos los botones
           // habilitarBotones(true);

            this.cboEstado.Enabled = true;
            this.cboTipoDocumento.Enabled = true;
            this.dtpFechaInicio.Enabled = true;
            this.dtpFechaFin.Enabled = true;
            this.btnBuscarProducto.Enabled = true;
            this.btnAgregar.Enabled = true;
            this.btnEliminar.Enabled = true;
            this.btnDevolucion.Enabled = false;
            this.btnVenta.Enabled = false;


            // Estableciendo focus al boton buscar cliente
            this.btnBuscarCliente.Focus();
        }

        private void editar()
        {
             if (this.prestamoActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_DEVUELTO))
            {
               Libreria.ShowMessageboxInfo("El préstamo ya ha sido devuelto", TITULO);
               return;
            }
            this.grpDatos.Enabled = true;

            //this.cboTipoDocumento.Enabled = false;
            //this.dtpFechaInicio.Enabled = false;
            //this.btnBuscarProducto.Enabled = false;
            //this.btnAgregar.Enabled = false;
            //this.btnEliminar.Enabled = false;
   
            //no se habilitan todos los botones
            //habilitarBotones(false);

            //Solo se habilita la opción de la venta, devolución o ampliar la fecha
            this.btnDevolucion.Enabled = true;
            this.btnVenta.Enabled = true;
            this.dtpFechaFin.Enabled = true;
            this.cboEstado.Enabled = true;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Editar);

            tipoOperacion = OperacionMantenimiento.Editar;
        }

        private bool validarEntrada()
        {
            this.txtClienteRazonSocial.Text = this.txtClienteRazonSocial.Text.Trim();

            if (this.txtClienteRazonSocial.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtClienteNroDocumento, "Debe elegir un Cliente", TITULO);
                return true;
            }

            if (this.dtpFechaInicio.Value > this.dtpFechaFin.Value)
            {
                Libreria.CampoNecesario(this.dtpFechaInicio, "La fecha de inicio del prestamo no puede ser mayor a la fecha fin", TITULO);
                return true;
            }

            ListPersonalizada<Item> listaItemsSeleccion = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;

            if ((listaItemsSeleccion == null) || (listaItemsSeleccion.Count == 0))
            {
                Libreria.CampoNecesario(this.dgvListadoItemsSeleccionados, "Debe ingresar por lo menos un Item", TITULO);
                return true;
            }

            return false;
        }

        private void grabar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                if (validarEntrada()) { return; }

                // Solicitar confirmacion
                if (!Libreria.ShowMessageboxPregunta("¿Estas seguro de registrar el Prestamo?", TITULO)) { return; }

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();

                operacion.prestamo = new Prestamo();

                // Estableciendo cliente
                operacion.prestamo.cliente = new Cliente();
                operacion.prestamo.cliente.codCliente = this.clienteActual.codCliente;

                operacion.prestamo.tienda = new Tienda();
                operacion.prestamo.tienda = ParametrosAplicacion.TIENDA_ACTUAL;

                operacion.prestamo.periodoxDias = (this.dtpFechaFin.Value - this.dtpFechaInicio.Value).Days.ToString();
                operacion.prestamo.fechaInicio = this.dtpFechaInicio.Value.ToString(Constantes.FORMATO_FECHAHORA);
                operacion.prestamo.fechaFin = this.dtpFechaFin.Value.ToString(Constantes.FORMATO_FECHAHORA);

                // Estableciendo usuario de registro
                operacion.prestamo.usuario = new Usuario();
                operacion.prestamo.usuario.codUsuario = ParametrosAplicacion.USUARIO_ACTUAL.codUsuario;

                // Estableciendo estado y fecha
                operacion.prestamo.estado = this.cboEstado.SelectedValue.ToString();
                operacion.prestamo.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);

                operacion.prestamo.listaItem = new ListaItem();
                operacion.prestamo.listaItem.lista = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;


                if (tipoOperacion == OperacionMantenimiento.Nuevo)
                {
                    operacion.prestamo.codPrestamo = Constantes.VALOR_CERO;
                    operacion.numero = Constantes.OPERACION_REGISTRAR_PRESTAMO;
                }
                else if (tipoOperacion == OperacionMantenimiento.Editar)
                {
                    operacion.prestamo.codPrestamo = this.txtCodigo.Text;
                    operacion.numero = Constantes.OPERACION_ACTUALIZAR_PRESTAMO;
                }

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    this.txtCodigo.Text = operacionResultado.codigoGenerado;
                    Libreria.ShowMessageboxInfo("Registro guardado correctamente", TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError("No se guardo los datos", TITULO);
                    return;
                }

                // Estableciendo los estados de los botones
                this.grpDatos.Enabled = false;
                // Estableciendo estado de TagPage de Listado y datos
                this.tabPagListado.Enabled = true;
                this.tabPagDatos.Enabled = false;

                // Mostrar la primera pagina del TabControl
                this.tabControl.SelectedIndex = 0;

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Generar);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void crearVenta()
        {
            using (frmVenta frmVenta = new frmVenta())
            {
                frmVenta.formularioVentaImportada = true;
                //se debe pasar el cliente con los datos de los items para crear la venta.
                frmVenta.clienteFormulario = this.clienteActual;
                // se debe pasar la lista de los items prestados, separados o entregados que están en el prestamo
                frmVenta.listaItemFormulario = new ListaItem();
                frmVenta.listaItemFormulario.lista = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;
                if (frmVenta.ShowDialog() == DialogResult.Cancel) { return; }
            }
        }

        private void itemsDevolver()
        {

            using (frmDevoluciones frmDevoluciones = new frmDevoluciones())
            {
                frmDevoluciones.formularioDevolucionImportada = true;
                //se debe pasar el cliente con los datos de los items para crear la venta.
                frmDevoluciones.clienteFormulario = this.clienteActual;
                frmDevoluciones.prestamoFormulario = this.prestamoActual;
                // se debe pasar la lista de los items prestados, separados o entregados que están en el prestamo
                frmDevoluciones.listaItemFormulario = new ListaItem();
                frmDevoluciones.listaItemFormulario.lista = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;
                if (frmDevoluciones.ShowDialog() == DialogResult.Cancel) { return; }
            }
          
        }

        private void agregarItem()
        {
            ListPersonalizada<Item> listaItems = null;
            ListPersonalizada<Item> listaItemsSeleccion = null;

            try
            {
                // Validar que el producto haya sido elegido
                if (validarAgregar()) { return; }

                // Capturando fuentes de datos de las grillas
                listaItems = (ListPersonalizada<Item>)this.dgvListadoItems.DataSource;
                listaItemsSeleccion = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;

                if (listaItemsSeleccion == null) { listaItemsSeleccion = new ListPersonalizada<Item>(); }

                // Validar si el producto tiene items disponibles
                if (listaItems.Count == 0)
                {
                    Libreria.ShowMessageboxExclamacion("El producto actual, no tiene items disponibles", TITULO);
                    return;
                }

                // Item Seleccionado
                Item itemSeleccionado = listaItems[this.dgvListadoItems.CurrentRow.Index];

                // Valida si el item ya fue agregado
                if (validarItemRepetido(itemSeleccionado.codItem))
                {
                    Libreria.CampoNecesario(this.dgvListadoItems, "Este item ya se encuentra asociado al prestamo", TITULO);
                    return;
                }

                // Instanciando item a agregar
                Item itemAgregar = new Item();
                itemAgregar.codItem = itemSeleccionado.codItem;

                itemAgregar.producto = new Producto();
                itemAgregar.producto.codigo = itemSeleccionado.producto.codigo;
                itemAgregar.producto.descripcion = itemSeleccionado.producto.descripcion;
                itemAgregar.producto = itemSeleccionado.producto;
                itemAgregar.producto.codProductoProveedor = itemSeleccionado.producto.codProductoProveedor;

                itemAgregar.estado = Constantes.ESTADO_ITEM_PRESTAMO;

                // Agregando item a listado de items seleccionados
                listaItemsSeleccion.Add(itemAgregar);

                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListadoItemsSeleccionados.AutoGenerateColumns = false;

                // Actualizando en grilla
                this.dgvListadoItemsSeleccionados.DataSource = null;
                this.dgvListadoItemsSeleccionados.DataSource = listaItemsSeleccion;

                pintarGrillaPrestamoActual(this.dgvListadoItemsSeleccionados);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void quitarItem()
        {
            ListPersonalizada<Item> listaItemsSeleccion = null;
            try
            {
                listaItemsSeleccion = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;

                if (listaItemsSeleccion != null && listaItemsSeleccion.Count > 0)
                {
                    // Item Seleccionado
                    Item itemSeleccionado = listaItemsSeleccion[this.dgvListadoItemsSeleccionados.CurrentRow.Index];

                    listaItemsSeleccion.Remove(itemSeleccionado);

                    // Actualizando en grilla
                    this.dgvListadoItemsSeleccionados.DataSource = null;
                    this.dgvListadoItemsSeleccionados.DataSource = listaItemsSeleccion;

                    pintarGrilla(this.dgvListadoItemsSeleccionados);
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }
        private bool validarAgregar()
        {
            this.txtProductoCodigo.Text = this.txtProductoCodigo.Text.Trim();
            this.txtProductoDescripcion.Text = this.txtProductoDescripcion.Text.Trim();

            if (this.txtProductoDescripcion.Text.Equals(string.Empty))
            {
                Libreria.ShowMessageboxExclamacion("Debe seleccionar un producto para agregar", TITULO);
                return true;
            }

            return false;
        }
        private bool validarItemRepetido(string codItem)
        {
            bool resultato = false;

            // Obteniendo lista de items seleccionados
            ListPersonalizada<Item> listaItemsSeleccion = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;

            if (listaItemsSeleccion != null)
            {
                foreach (Item item in listaItemsSeleccion)
                {
                    if (item.codItem.Equals(codItem))
                    {
                        resultato = true;
                        break;
                    }
                }
            }

            return resultato;
        }
        private void cancelar()
        {
            if ((this.tipoOperacion == OperacionMantenimiento.Editar) ||
                 (!this.grpDatos.Enabled))
            {
                this.txtClienteBusqueda.Text = this.txtClienteRazonSocial.Text;

                // Refrescar grilla
                pintarGrilla(dgvListadoPrestamos);
            }

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

            // Mostrar la primera pagina del TabControl
            this.tabControl.SelectedIndex = 0;

            // Deshabilitando el grupoBox de datos
            this.grpDatos.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Cancelar);

            // Estableciendo focus
            this.btnBuscar.Focus();
        }
        #endregion

        



  

       
      

    }
}
